// Copyright 2023 Huawei Cloud Computing Technology Co., Ltd.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef VMI_TCP_SOCKET_H
#define VMI_TCP_SOCKET_H

#include "Communication/Socket/VmiSocket.h"

class VmiTcpSocket : public VmiSocket {
public:
    /*
     * @功能描述：TCP通信套接字基类构造函数
     */
    VmiTcpSocket() = default;

    /**
     * @功能描述：带参构造函数
     * @参数 [in] fd：套接字句柄
     * @参数 [in] address：IP地址、端口
     * @参数 [in] socketOption：套接字选项
     */
    VmiTcpSocket(int fd, const VmiSocketAddressGroup &address, unsigned int socketOption);

    /*
     * @功能描述：虚析构函数，如果tcp socket未关闭，则关闭它
     */
    virtual ~VmiTcpSocket() override;

    /*
     * @功能描述：连接服务端
     * @返回值：未实现，直接返回0
     */
    int Connect() override;

    /*
     * @功能描述：设置发送超时时间
     * @参数 [in] sec：秒
     * @参数 [in] usec：微秒
     */
    void SetSendTimeout(long sec, long usec) override;

    /*
     * @功能描述：设置接收超时时间
     * @参数 [in] sec：秒
     * @参数 [in] usec：微秒
     */
    void SetRecvTimeout(long sec, long usec) override;

    /*
     * @功能描述：通过TCP发送数据
     * @参数 [in] sendBuf：待发送数据
     * @返回值：大于等于0表示实际发送的字节数，小于0表示失败
     */
    ssize_t Send(const VmiBuffer &sendBuf) override;

    /*
     * @功能描述：通过TCP接收数据
     * @参数 [in] recvBuf：接收缓存
     * @返回值：大于0表示实际接收到的字节数，小于等于0表示失败
     */
    ssize_t Recv(const VmiBuffer &recvBuf) override;

    /*
     * @功能描述：关闭socket
     */
    void CloseSocket() override;

private:
    /*
     * @功能描述：更新已发送字节数统计
     * @参数 [in] bytes：新增发送的字节数
     */
    void UpdateBytesSent(size_t bytes);

    /*
     * @功能描述：更新已接收字节数统计
     * @参数 [in] bytes：新增接收的字节数
     */
    void UpdateBytesRecv(size_t bytes);

    /*
     * @功能描述：尽可能发送全部数据
     * @参数 [in] sendBuf：待发送数据
     * @返回值：大于0表示实际发送的字节数，小于等于0表示失败
     */
    ssize_t SendFully(const VmiBuffer &sendBuf);
};

#endif // VMI_TCP_SOCKET_H